package com.yonyou.nc.richeditor;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GraphicsEnvironment;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.Element;
import javax.swing.text.MutableAttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.text.StyledEditorKit;

public class MainClass {
	  public MainClass() {
	    JFrame frame = new JFrame();
	    JTextPane textPane = new JTextPane();
	    JScrollPane scrollPane = new JScrollPane(textPane);

	    JPanel north = new JPanel();

	    JMenuBar menu = new JMenuBar();
	    JMenu styleMenu = new JMenu();
	    styleMenu.setText("Style");

	    Action boldAction = new BoldAction();
	    boldAction.putValue(Action.NAME, "Bold");
	    styleMenu.add(boldAction);

	    Action italicAction = new ItalicAction();
	    italicAction.putValue(Action.NAME, "Italic");
	    styleMenu.add(italicAction);

	    Action foregroundAction = new ForegroundAction();
	    foregroundAction.putValue(Action.NAME, "Color");
	    styleMenu.add(foregroundAction);

	    Action formatTextAction = new FontAndSizeAction();
	    formatTextAction.putValue(Action.NAME, "Font and Size");
	    styleMenu.add(formatTextAction);

	    menu.add(styleMenu);

	    north.add(menu);
	    frame.getContentPane().setLayout(new BorderLayout());
	    frame.getContentPane().add(north, BorderLayout.NORTH);
	    frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
	    frame.setSize(800, 500);
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.setVisible(true);
	  }

	  public static void main(String[] args) {
	    new MainClass();
	  }
	}
	class BoldAction extends StyledEditorKit.StyledTextAction {
	  private static final long serialVersionUID = 9174670038684056758L;

	  public BoldAction() {
	    super("font-bold");
	  }

	  public String toString() {
	    return "Bold";
	  }

	  public void actionPerformed(ActionEvent e) {
	    JEditorPane editor = getEditor(e);
	    if (editor != null) {
	      StyledEditorKit kit = getStyledEditorKit(editor);
	      MutableAttributeSet attr = kit.getInputAttributes();
	      boolean bold = (StyleConstants.isBold(attr)) ? false : true;
	      SimpleAttributeSet sas = new SimpleAttributeSet();
	      StyleConstants.setBold(sas, bold);
	      setCharacterAttributes(editor, sas, false);

	    }
	  }
	}

	class ItalicAction extends StyledEditorKit.StyledTextAction {

	  private static final long serialVersionUID = -1428340091100055456L;

	  public ItalicAction() {
	    super("font-italic");
	  }

	  public String toString() {
	    return "Italic";
	  }

	  public void actionPerformed(ActionEvent e) {
	    JEditorPane editor = getEditor(e);
	    if (editor != null) {
	      StyledEditorKit kit = getStyledEditorKit(editor);
	      MutableAttributeSet attr = kit.getInputAttributes();
	      boolean italic = (StyleConstants.isItalic(attr)) ? false : true;
	      SimpleAttributeSet sas = new SimpleAttributeSet();
	      StyleConstants.setItalic(sas, italic);
	      setCharacterAttributes(editor, sas, false);
	    }
	  }
	}
	class ForegroundAction extends StyledEditorKit.StyledTextAction {

	  private static final long serialVersionUID = 6384632651737400352L;

	  JColorChooser colorChooser = new JColorChooser();

	  JDialog dialog = new JDialog();

	  boolean noChange = false;

	  boolean cancelled = false;

	  public ForegroundAction() {
	    super("foreground");

	  }

	  public void actionPerformed(ActionEvent e) {
	    JTextPane editor = (JTextPane) getEditor(e);

	    if (editor == null) {
	      JOptionPane.showMessageDialog(null,
	          "You need to select the editor pane before you can change the color.", "Error",
	          JOptionPane.ERROR_MESSAGE);
	      return;
	    }
	    int p0 = editor.getSelectionStart();
	    StyledDocument doc = getStyledDocument(editor);
	    Element paragraph = doc.getCharacterElement(p0);
	    AttributeSet as = paragraph.getAttributes();
	    fg = StyleConstants.getForeground(as);
	    if (fg == null) {
	      fg = Color.BLACK;
	    }
	    colorChooser.setColor(fg);

	    JButton accept = new JButton("OK");
	    accept.addActionListener(new ActionListener() {
	      public void actionPerformed(ActionEvent ae) {
	        fg = colorChooser.getColor();
	        dialog.dispose();
	      }
	    });

	    JButton cancel = new JButton("Cancel");
	    cancel.addActionListener(new ActionListener() {
	      public void actionPerformed(ActionEvent ae) {
	        cancelled = true;
	        dialog.dispose();
	      }
	    });

	    JButton none = new JButton("None");
	    none.addActionListener(new ActionListener() {
	      public void actionPerformed(ActionEvent ae) {
	        noChange = true;
	        dialog.dispose();
	      }
	    });

	    JPanel buttons = new JPanel();
	    buttons.add(accept);
	    buttons.add(none);
	    buttons.add(cancel);

	    dialog.getContentPane().setLayout(new BorderLayout());
	    dialog.getContentPane().add(colorChooser, BorderLayout.CENTER);
	    dialog.getContentPane().add(buttons, BorderLayout.SOUTH);
	    dialog.setModal(true);
	    dialog.pack();
	    dialog.setVisible(true);

	    if (!cancelled) {

	      MutableAttributeSet attr = null;
	      if (editor != null) {
	        if (fg != null && !noChange) {
	          attr = new SimpleAttributeSet();
	          StyleConstants.setForeground(attr, fg);
	          setCharacterAttributes(editor, attr, false);
	        }
	      }
	    }// end if color != null
	    noChange = false;
	    cancelled = false;
	  }

	  private Color fg;
	}

	class FontAndSizeAction extends StyledEditorKit.StyledTextAction {

	  private static final long serialVersionUID = 584531387732416339L;

	  private String family;

	  private float fontSize;

	  JDialog formatText;

	  private boolean accept = false;

	  JComboBox fontFamilyChooser;

	  JComboBox fontSizeChooser;

	  public FontAndSizeAction() {
	    super("Font and Size");
	  }

	  public String toString() {
	    return "Font and Size";
	  }

	  public void actionPerformed(ActionEvent e) {
	    JTextPane editor = (JTextPane) getEditor(e);
	    int p0 = editor.getSelectionStart();
	    StyledDocument doc = getStyledDocument(editor);
	    Element paragraph = doc.getCharacterElement(p0);
	    AttributeSet as = paragraph.getAttributes();

	    family = StyleConstants.getFontFamily(as);
	    fontSize = StyleConstants.getFontSize(as);

	    formatText = new JDialog(new JFrame(), "Font and Size", true);
	    formatText.getContentPane().setLayout(new BorderLayout());

	    JPanel choosers = new JPanel();
	    choosers.setLayout(new GridLayout(2, 1));

	    JPanel fontFamilyPanel = new JPanel();
	    fontFamilyPanel.add(new JLabel("Font"));

	    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
	    String[] fontNames = ge.getAvailableFontFamilyNames();

	    fontFamilyChooser = new JComboBox();
	    for (int i = 0; i < fontNames.length; i++) {
	      fontFamilyChooser.addItem(fontNames[i]);
	    }
	    fontFamilyChooser.setSelectedItem(family);
	    fontFamilyPanel.add(fontFamilyChooser);
	    choosers.add(fontFamilyPanel);

	    JPanel fontSizePanel = new JPanel();
	    fontSizePanel.add(new JLabel("Size"));
	    fontSizeChooser = new JComboBox();
	    fontSizeChooser.setEditable(true);
	    fontSizeChooser.addItem(new Float(4));
	    fontSizeChooser.addItem(new Float(8));
	    fontSizeChooser.addItem(new Float(12));
	    fontSizeChooser.addItem(new Float(16));
	    fontSizeChooser.addItem(new Float(20));
	    fontSizeChooser.addItem(new Float(24));
	    fontSizeChooser.setSelectedItem(new Float(fontSize));
	    fontSizePanel.add(fontSizeChooser);
	    choosers.add(fontSizePanel);

	    JButton ok = new JButton("OK");
	    ok.addActionListener(new ActionListener() {
	      public void actionPerformed(ActionEvent ae) {
	        accept = true;
	        formatText.dispose();
	        family = (String) fontFamilyChooser.getSelectedItem();
	        fontSize = Float.parseFloat(fontSizeChooser.getSelectedItem().toString());
	      }
	    });

	    JButton cancel = new JButton("Cancel");
	    cancel.addActionListener(new ActionListener() {
	      public void actionPerformed(ActionEvent ae) {
	        formatText.dispose();
	      }
	    });

	    JPanel buttons = new JPanel();
	    buttons.add(ok);
	    buttons.add(cancel);
	    formatText.getContentPane().add(choosers, BorderLayout.CENTER);
	    formatText.getContentPane().add(buttons, BorderLayout.SOUTH);
	    formatText.pack();
	    formatText.setVisible(true);

	    MutableAttributeSet attr = null;
	    if (editor != null && accept) {
	      attr = new SimpleAttributeSet();
	      StyleConstants.setFontFamily(attr, family);
	      StyleConstants.setFontSize(attr, (int) fontSize);
	      setCharacterAttributes(editor, attr, false);
	    }

	  }
	}
